/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package slic.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
import com.liferay.portal.kernel.dao.orm.OrderFactoryUtil;
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.model.User;

import slic.NoSuchInscripcionMensajeException;
import slic.inscripcion.Inscripcion;
import slic.inscripcion.InscripcionMensajeTypes;
import slic.model.Deportista;
import slic.model.InscripcionMensaje;
import slic.service.InscripcionMensajeLocalServiceUtil;
import slic.service.base.InscripcionMensajeLocalServiceBaseImpl;
import slic.service.persistence.InscripcionMensajeUtil;

/**
 * The implementation of the InscripcionMensaje local service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link slic.service.InscripcionMensajeLocalService} interface.
 *
 * <p>
 * This is a local service. Methods of this service will not have security checks based on the propagated JAAS credentials because this service can only be accessed from within the same VM.
 * </p>
 *
 * @author Pablo Carballo
 * @see slic.service.base.InscripcionMensajeLocalServiceBaseImpl
 * @see slic.service.InscripcionMensajeLocalServiceUtil
 */
public class InscripcionMensajeLocalServiceImpl
	extends InscripcionMensajeLocalServiceBaseImpl {
	/*
	 * NOTE FOR DEVELOPERS:
	 *
	 * Never reference this interface directly. Always use {@link slic.service.InscripcionMensajeLocalServiceUtil} to access the InscripcionMensaje local service.
	 */
	
	private static Log _log = LogFactoryUtil.getLog(InscripcionMensajeLocalServiceImpl.class);
	
	public InscripcionMensaje agregarMensajeReinscripcion(User userOrigen, Deportista deportista, User userDestino) 
			throws SystemException, PortalException {		

		InscripcionMensaje inscripcionMensaje = createInscripcionMensaje(
				counterLocalService.increment(InscripcionMensaje.class.getName()));		
		
		inscripcionMensaje.setUserIdOrigen(userOrigen.getUserId());
		inscripcionMensaje.setUserIdDestino(userDestino.getUserId());
		inscripcionMensaje.setCreateDate(new Date());
		inscripcionMensaje.setMensaje(deportista.getInscripcionStatusComment());
		inscripcionMensaje.setDeportistaId(deportista.getDeportistaId());
		inscripcionMensaje.setTipoMensaje(InscripcionMensajeTypes.DEPORTISTA_REINSCRIPCION);
		inscripcionMensaje.setIsValid(true);
		
		return updateInscripcionMensaje(inscripcionMensaje);
	}
	
	public InscripcionMensaje invalidate(int tipoMensaje, Deportista deportista) throws NoSuchInscripcionMensajeException, SystemException {
		
		InscripcionMensaje im = InscripcionMensajeUtil.findByTipo_Deportista_Valid_First(tipoMensaje, deportista.getDeportistaId(), true, null);
		im.setIsValid(false);
		return updateInscripcionMensaje(im);
		
	}
	
	public InscripcionMensaje revalidate(int tipoMensaje, Deportista deportista) throws NoSuchInscripcionMensajeException, SystemException {
		
		InscripcionMensaje im = InscripcionMensajeUtil.findByTipo_Deportista_Valid_First(tipoMensaje, deportista.getDeportistaId(), true, null);
		im.setIsValid(true);
		return updateInscripcionMensaje(im);		
		
	}
	
	private String getStringFromMap(Map<String, String> map, String key, String defaultValue) {		
		String original = map.get(key);
		return original == null ? defaultValue : original.trim();		
	}
	
	private DynamicQuery createDynamicQueryFromMap(Map<String, String> map, boolean count) {

		DynamicQuery query = DynamicQueryFactoryUtil.forClass(InscripcionMensaje.class);

		if (!count) {
			String orderBy = getStringFromMap(map, "orderBy", "createDate");
			String orderType = getStringFromMap(map, "orderType", "desc");
			
			if (orderType.equals("desc")) {
				query.addOrder(OrderFactoryUtil.desc(orderBy));
			} else {
				query.addOrder(OrderFactoryUtil.asc(orderBy));
			}					
		}
		
		String isValid = getStringFromMap(map, "isValid", null);
		if (isValid != null) {
			boolean searchForValid = isValid.toLowerCase().equalsIgnoreCase("true");
			query.add(PropertyFactoryUtil.forName("isValid").eq(searchForValid));
		}

		return query;

	}

	public List<InscripcionMensaje> findByMap(Map<String, String> map) throws SystemException {

		DynamicQuery query = createDynamicQueryFromMap(map, false);

		return InscripcionMensajeUtil.findWithDynamicQuery(query);

	}

	public List<InscripcionMensaje> findByMap(Map<String, String> map, int start, int end) throws SystemException {

		DynamicQuery query = createDynamicQueryFromMap(map, false);

		return InscripcionMensajeUtil.findWithDynamicQuery(query, start, end);

	}

	public long countByMap(Map<String, String> map) throws SystemException {

		DynamicQuery query = createDynamicQueryFromMap(map, true);

		return new InscripcionMensajeUtil().countWithDynamicQuery(query);

	}
	
}